//显示一个窗口

/*
GLAD使用步骤：GLAD可以使OpenGL基础渲染变得十分简单，只需要简单四个步骤就可以完成基础渲染。流程如下：
1.初始化GLAD库，加载所有OpenGL函数指针。
2.创建着色器并附加到着色器程序。
3.构建缓冲对象并附加到顶点属性。
4.使用着色器程序，利用渲染接口将缓冲对象按照指定图元类型渲染出来。
*/
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <stdlib.h>
// settings
static const unsigned int SCR_WIDTH = 800;
static const unsigned int SCR_HEIGHT = 600;

/**
 * 输入事件监听
 */
static void processInput1(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, 1);
}
/**
 * 窗口大小变化监听
 */
static void framebuffer_size_callback(GLFWwindow *window, int width, int hegiht)
{
    //printf("frame size callback width:%d, height:%d\n", width, hegiht);
    //当用户改变窗口的大小的时候，视口也应该被调整
    glViewport(0, 0, width, hegiht);
}
/**
 * 初始化
 */
static GLFWwindow *init()
{
    //初始化GLFW
    glfwInit();
    //将主版本号(Major)和次版本号(Minor)都设为3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //告诉GLFW我们使用的是核心模式(Core-profile)
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        printf("Failed to create GLFW window\n");
        glfwTerminate();
        return NULL;
    }
    glfwMakeContextCurrent(window);

    //初始化GLAD库 任何的OpenGL接口调用都必须在初始化GLAD库后才可以正常访问
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        printf("Failed to initialize GLAD");
        return NULL;
    }

    // 注册窗口变化监听
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    // 设置视口,告诉opengl渲染窗口的尺寸大小
    glViewport(0, 0, width, height);
    return window;
}

int main1(void)
{
    //初始化，创建窗口
    GLFWwindow *window = init();
    while (!glfwWindowShouldClose(window))
    {
        processInput1(window);
        //设置清除颜色
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        //使用上面设置的颜色清空屏幕
        glClear(GL_COLOR_BUFFER_BIT);
        //交换颜色缓冲区
        glfwSwapBuffers(window);
        //检查事件
        glfwPollEvents();
    }

    //glfwTerminate会销毁窗口释放资源，因此在调用该函数后，如果想使用glfw库函数，就必须重新初始化。
    glfwTerminate();
    return 0;
}